  LPR-Modula hat ja einige Fehler, besonders bei den Bibliotheken, aber
  rgerlich sind die Fehler im Laufzeitsystem, weil man sich hierfr nicht
  einfach ein neues Modul schreiben kann (geht schon, ist aber aufwendig, da
  in Assembler). Bisher sind mir fnf Fehler im Zusammenhang mit der
  (LONG)REAL-Arithmetik aufgefallen, die mit dem hier beschriebenen Patch-
  Programm auch beseitigt werden knnen, als da wren:

  - Die LONGREAL-Division arbeitet nicht mit der erforderlichen
    Genauigkeit (ca. 10 statt 16 Dezimalstellen). Das hat nicht
    nur auf die eigentliche Division Einflu, sondern auch auf die
    Verarbeitung von LONGREAL-Konstanten durch den Compiler, denn
    bei der Umwandlung der Zeichenketten in die interne Darstellung
    als 8-Byte-Wert wird ebenfalls die LONGREAL-Division bentigt.

  - Die Konvertierung von LONGREAL zu REAL arbeitet nicht immer
    korrekt (Bei der Rundung wird ein Mantissenberlauf nicht
    richtig behandelt), hierfr ist die Funktion SHORT in der LONGREAL-
    Variante zustndig. Hier kann es vorkommen, da eine Zahl mit
    ausschlielich Neunen in der Mantisse nicht auf die nchsthhere Zahl
    aufgerundet wird, sondern auf das eineinhalbfache.
    Dies betrifft aber genauso REAL-Konstanten, denn diese werden vom
    Compiler als LONGREAL-Konstanten eingelesen und dann erst mit
    SHORT nach REAL konvertiert.

  - Bei LPR arbeiten ja die Standardfunktionen nicht mit CARDINAL
    sondern mit INTEGER, soda auch TRUNC, FLOAT, TRUNCD und FLOATD
    auf negative Zahlen angewendet werden knnen. Leider behandelt
    FLOAT negative Zahlen nicht korrekt.

  - Die Standardfunktion TRUNCD meldet schon bei -2147483648.0D einen
    berlauf, obwohl dies eigentlich erst bei -2147483649.0D der Fall
    wre.

  - Der Vergleich zweier LONGREAL-Zahlen arbeitet nicht immer korrekt.
    Es kann sein, da eine Zahl, die grer ist als eine andere,
    pltzlich fr die kleinere gehalten wird. Das passiert, wenn
    die beiden oberen Mantissenhlften bereinstimmen, und die eine
    untere Mantissenhlfte, als Zweierkomplementzahl interpretiert,
    negativ ist (also oberstes Bit gesetzt).



  Die fehlerhaften Routinen sitzen an zwei Stellen: Einmal im Modul
  'System' und ein zweitesmal sitzt das komplette Modul 'System' im Modul
  'M2Shell'. 'M2Shell' ist fr die Laufzeituntersttzung nicht `gelinkter'
  Programme und den Compiler zustndig, 'System' ist lediglich fr die
  Laufzeituntersttzung `gelinkter' Programme zustndig. Es mssen also
  beide Module korrigiert werden. Dazu ersetzt das Programm 'PATCH.TOS'
  die fehlerhaften Routinen in beiden Modulen durch neue (die hoffentlich
  fehlerfrei sind).

  Das Programm ist ziemlich unkomfortabel, aber da es wohl nur einmal
  benutzt wird, habe ich mir eine groartige Benutzeroberflche (...dieses
  Wort: ist das nun die Oberflche des Benutzers, also die Haut, oder was...)
  Am besten geht man nach folgendem Rezept vor:


  1. RTSPATCH.TOS und die unvernderten Originalmodule M2SHELL.OBM und
     SYSTEM.OBM in ein gemeinsames Verzeichnis kopieren (z.B. das
     Wurzelverzeichnis, nicht das Verzeichnis nehmen, in dem die
     Originalmodule stehen, sicher ist sicher... )

  2. Das Programm starten

  3. Auf die Frage, welches der Module gepatcht werden soll, mit '1' oder
     '2' antworten

  4. Auf die Frage, welche Routinen gepatcht werden sollen, mit '6' (alle
     Routinen) antworten


  Auf dem Bildschirm erscheinen Meldungen, welche Routinen gerade gepatcht
  wurden.


  5. Auf die Frage, ob weitergemacht werden soll, mit 'j' antworten

  6. Schritte 3 und 4 fr das andere Modul wiederholen. Die Frage bei
     Schritt 5 mit einem 'Return' beantworten


  Folgende Fehler knnen auftreten, wobei das Programm nach einer Meldung
  mit einem Tastendruck abgebrochen wird:

   - Die zu patchenden Module befinden sich nicht im gleichen Verzeichnis
     oder sind schreibgeschtzt.

   - Die Module wurden schon gepatcht oder liegen in einer anderen Version
     vor (in diesem Fall mten die Offset-Konstanten in PATCH.MOD
     entsprechend gendert werden, was allerdings voraussetzt, da die
     Positionen der entsprechenden Routinen in SYSTEM.OBM und die Position
     von SYSTEM.OBM innerhalb von M2SHELL.OBM gesucht werden. Sollte mal
     eine neue Version von LPR-Modula erscheinen, werde ich die Konstanten
     entsprechend ndern).

   - Ein Fehler bei der Dateibearbeitung.


  Hinweis fr Benutzer der auf Sammeldisk #1 (ST 285) enthaltenen Module
  fr LPR-Modula: Die Module 'RealInOut' und 'LongMathLib0' benutzen zur Ver-
  meidung der Fehler, die bei LONGREAL-Division und -Konstanten entstehen, die
  Prozeduren "Rec" und "Long" bzw. begngen sich mit REAL-Konstanten.
  Dies fhrt bei einer korrekten LONGREAL-Division erneut zu Ungenauigkeiten,
  soda in den beiden Modulen am besten smtliche Aufrufe von "Long" und
  ersatzweise Verwendungen von REAL-Konstanten durch richtige LONGREAL-
  Konstanten ersetzt werden, und smtliche Vorkommen von Multiplikationen
  mit der Funktion "Rec" - also z.B.  x * Rec(y) - durch Divisionen ersetzt
  werden - im Beispiel also: x / y .
  Soweit ich das ausprobiert habe, reicht es im Modul 'RealInOut' auch
  folgendes zu tun (aber bitte nur als Notbehelf):

  Im Initialisierungsteil des Moduls (ziemlich am Ende der Datei) gibt es
  eine Zuweisung

    E14:=1.0E14;

  Diese ist durch

    E14:=1.0D14;

  zu ersetzen. Das reicht anscheinend schon fr korrekte Ergebnisse; sicherer
  ist es aber auf alle Flle, smtliche `Hilslsungen' in der oben angegebenen
  Weise zu ersetzen. Bei 'LongMathLib0' habe ich bisher nicht ausprobiert, ob
  es auch hier reicht, nur bestimmte Werte oder Anweisungen zu ersetzen.

  Bei der Anpassung sollten die Hinweise fr LONGREAL-Konstanten in
  LPR_M2.TXT: "LONG-Konstanten" beachtet werden. Statt negativer Konstanten
  werden z.B. positive deklariert, die dann bei der Anwendung mit negativem
  Vorzeichen benutzt werden, bzw. subtrahiert statt addiert werden.

